#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Терминал управления хостингом: состояние, включение, проверки.

    pult              открыть в браузере
    pult --port 7900  на другом порту, если 7788 занят
    terminal --check      разовая проверка в терминале (спросит пароль)
    pult --no-open    запустить, но браузер не открывать

Зависимостей нет: только стандартная библиотека python3.
"""
import getpass
import os
import sys

ЗДЕСЬ = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, ЗДЕСЬ)

from core import checks, server, state, vault      # noqa: E402

ЦВЕТ = {"critical": "\033[31m", "warn": "\033[33m", "info": "\033[2m"}
ЗНАК = {"critical": "!!", "warn": " !", "info": "  "}
СБРОС = "\033[0m"


def порт():
    if "--port" in sys.argv:
        try:
            return int(sys.argv[sys.argv.index("--port") + 1])
        except (IndexError, ValueError):
            sys.exit("После --port нужен номер порта.")
    return 7788


def разово():
    люди = vault.пользователи()
    if not люди:
        sys.exit("Учётных записей ещё нет. Запустите программу и заведите первую.")
    логин = люди[0] if len(люди) == 1 else input("Логин (%s): " % ", ".join(люди))
    try:
        данные = vault.прочитать(логин, getpass.getpass("Пароль: "))
    except vault.НетДоступа as e:
        sys.exit(str(e))
    провайдеры = server.собрать_провайдеров(данные.get("providers", []))
    if not провайдеры:
        sys.exit("Ни один хостинг не подключён.")
    срез = state.собрать(провайдеры, {"sites": данные.get("sites") or []})
    находки = checks.прогнать(срез)
    print("\nПроверено %s, за %s с" % (срез["at"], срез["took"]))
    for с in срез.get("sites", []):
        print("  %-28s %s  запросов %s"
              % (с["title"], "работает" if с["ok"] else "не отвечает",
                 с["requests"]))
    if not находки:
        print("\n\033[32mЗамечаний нет.\033[0m\n")
        return 0
    print("\nЗамечаний: %d" % len(находки))
    for н in находки:
        print("%s%s %s — %s%s" % (ЦВЕТ.get(н["severity"], ""),
                                  ЗНАК.get(н["severity"], "  "),
                                  н["subject"], н["title"], СБРОС))
        print("     %s" % н["detail"])
        if н["fix"]:
            print("     \033[2m→ %s\033[0m" % н["fix"])
    print()
    return 1 if any(н["severity"] == "critical" for н in находки) else 0


def main():
    if "--check" in sys.argv:
        sys.exit(разово())
    server.запустить(порт(), открыть="--no-open" not in sys.argv)


if __name__ == "__main__":
    main()
